package com.jwinf.cdLibary.controller;

import com.jwinf.cdLibary.domain.CD;
import com.jwinf.cdLibary.service.CDService;
import com.jwinf.cdLibary.tool.WindowUtils;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;



import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;


/**
 * @author jwinf
 *借阅窗体控制类
 */
public class BorrowController extends CdController implements Initializable {
    @FXML
    private Label back;
    @FXML
    private TextField nametxt;
    @FXML
    private TableView table;
    @FXML
    private Button borrowbtn;
    @FXML
    private Label search;

    private ObservableList<CD> list;
    private CD cd = new CD();
    private CDService service = new CDService();

    // 初始化方法
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        componentInit();               // 组件初始化
        addListener();                 // 添加监听器
    }

    // 组件初始化
    private void componentInit(){
        // 给标签添加icon样式
        Image image;
        image = new Image(getClass().getResourceAsStream("/icon/searchIcon.png"), 32, 32, false, false);
        search.setGraphic(new ImageView(image));

        image = new Image(getClass().getResourceAsStream("/icon/backIcon.png"), 32, 32, false, false);
        back.setGraphic(new ImageView(image));

        // 给表格添加列 并为每列绑定一个相关实体类的属性 这样表格可以观察该对象的变化
        TableColumn nameCol = new TableColumn("名称");
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
        nameCol.setPrefWidth(120);

        TableColumn sortCol = new TableColumn("分类");
        sortCol.setCellValueFactory(new PropertyValueFactory<>("sort"));
        sortCol.setPrefWidth(120);

        TableColumn numCol = new TableColumn("数量");
        numCol.setCellValueFactory(new PropertyValueFactory<>("number"));
        numCol.setPrefWidth(120);

        TableColumn stateCol = new TableColumn("状态");
        stateCol.setCellValueFactory(new PropertyValueFactory<>("state"));
        stateCol.setPrefWidth(120);

        // 给表格添加列
        table.getColumns().addAll(nameCol, sortCol, numCol, stateCol);
    }

    // 添加监听器
    private void addListener(){
        // 通过自定义工具类改变鼠标演示 使鼠标进入某些组件时把鼠标样式改为手型
        WindowUtils.changeMouse(search);
        WindowUtils.changeMouse(borrowbtn);
        WindowUtils.changeMouse(back);
        // 通过自定义工具类在执行某些耗时操作时把鼠标的样式改为等待中的样式
        WindowUtils.MouseWait(search);
    }

    // 查找方法
    @FXML
    private void find(){
        // 获取组件中的数据
        String name = nametxt.getText();
        // 对数据进行校验
        if (name == null || name.isEmpty()){
            WindowUtils.showTip("请输入检索词", "/icon/WarnIcon.png", " -fx-background-color: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%)");
            return;
        }
        // 给cd对象设置数据
        cd.setName(name);
        // 调用服务层的查询方法，并将结构转换成tableview支持的数据类型observableList
        list = FXCollections.observableArrayList(service.find(cd));
        // 给表格设置数据
        if(!list.isEmpty())
            table.setItems(list);
        else{
            // 通过自定义工具类 弹出弹窗提示用户
            WindowUtils.showTip("查无此盘", "/icon/WarnIcon.png", " -fx-background-color: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%)");
            table.refresh();                   // 刷新表格
        }

    }

    // 借阅光盘方法
    @FXML
    private void borrow(){
        // 获取用户选中的行号
        int index = table.getSelectionModel().getSelectedIndex();
        // 判断行号是否为空
        if(index < 0){
            // 通过自定义工具类弹出弹窗提示用户
            WindowUtils.showTip("请选择借阅对象", "/icon/WarnIcon.png", " -fx-background-color: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%)");
            return;
        }

        // 获取用户选中的对象 通过observableList
        CD cd = list.get(index);
        // 判断是否可供借阅
       if(list.get(index).getNumber() == 0){
           WindowUtils.showTip("库存不足借阅失败", "/icon/WarnIcon.png", " -fx-background-color: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%)");
           return;
       }
       // 调用服务层的借阅方法 并判断是否借阅成功
       boolean isSuccess = service.borrow(cd, user.getUsername());
       if(isSuccess){
           // 同自定义工具方法弹出弹窗提示用户
           WindowUtils.showTip("借阅成功", "/icon/SuccessIcon.png", " -fx-background-color: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%)");

           // 刷新表格数据
           list = FXCollections.observableArrayList(service.find(cd));
           table.setItems(list);
       }else
           // 通过自定义工具类弹窗弹窗提示用户
           WindowUtils.showTip("借阅失败", "/icon/WarnIcon.png", " -fx-background-color: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%)");
    }

    // 返回用户主界面
    @FXML
    private void back() throws IOException {
        // 通过自定义工具类弹出用户主界面
        WindowUtils.showFrame("/com/jwinf/cdLibary/view/UserMainFrame.fxml", "/icon/loginIcon.png", "用户主界面", user);
        WindowUtils.destroyStage(back);          // 销毁当前窗体
    }

}
